/******************************************************************************

    Copyright (C) 2006 Alessio Stalla (alessiostalla@gmail.com)

    This file is part of PrettyProlog.

    PrettyProlog is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.

    PrettyProlog is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with PrettyProlog; if not, write to the Free Software
    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA

    See the file COPYING for further details.

 *****************************************************************************/

package prettyprolog.datatypes;

/**
 * An abstract class that implements some of Term's methods in a basic way,
 * making it easier to implement subclasses of Term.
 * 
 * @author Alessio Stalla
 */
public abstract class AbstractTerm implements Term {

	private static final long serialVersionUID = 1L;

	/**
	 * AbstractTerm by default considers itself to be ground, so this method
	 * returns this same <code>Term</code>.
	 */
	public Term apply(Substitution subst) {
		return this;
	}

	/**
	 * AbstractTerm by default considers itself to be ground, so this method
	 * returns <code>true</code>.
	 * 
	 * @return <code>true</code>.
	 */
	public boolean isGround(boolean strict) {
		return true;
	}

	/** @return <code>true</code>. */
	public boolean isGround() {
		return isGround(true);
	}

	/**
	 * AbstractTerm by default considers itself to be ground, so this method
	 * returns <code>this</code> and does not modify <code>vars</code>.
	 */
	public Term copy(Substitution vars) {
		return this;
	}

	public boolean contains(Term t) {
		return contains(t, false);
	}

	/**
	 * AbstractTerm by default considers itself to be non-compound, so this
	 * method returns <code>false</code>.
	 */
	public boolean contains(Term t, boolean deep) {
		return false;
	}

}
